import { IsEmail, IsNotEmpty, IsString, isNotEmpty } from 'class-validator';
import { IntersectionType, PartialType, PickType } from '@nestjs/mapped-types';

export class CreateUserDto {
    @IsString()
    @IsNotEmpty()
    username: string;
    password: string;
    email: string;
    addr: number;
    // 可以根据需要添加更多字段
}

// partialType 可以根据 CreateUserDto 生成一个新的类型，新类型的所有字段都是可选的
export class UpdateUserDto extends PartialType(CreateUserDto) {}

// pickType 可以根据 CreateUserDto 生成一个新的类型，新类型只包含指定的字段
export class PickUserDto extends PickType(CreateUserDto, [
    'username',
] as const) {
    // 可以根据需要添加更多字段
    @IsNotEmpty()
    age: number;
}

// omitType 可以根据 CreateUserDto 生成一个新的类型，新类型不包含指定的字段
export class OmitUserDto extends PickType(CreateUserDto, ['email'] as const) {}

// IntersectionType 函数将两种类型合并为一种新类型
export class IntersectionUserDto extends IntersectionType(
    CreateUserDto,
    PickUserDto,
) {}

// 类型映射函数组合， 生成一个PartialCreateUserDto的新类型，username必须 其它可选
export class PartialCreateUserDto extends PartialType(
    PickType(CreateUserDto, ['username'] as const),
) {}

console.log(PartialCreateUserDto);
